package ink.lovejinhu.special.dp;

import java.util.ArrayList;

/**
 * @author jinhu
 * created 2021-07-26 15:07
 */
public class Solution_0010 {
    /**
     * 正则表达式匹配
     *
     * @param s
     * @param p
     * @return
     */
    public boolean isMatch(String s, String p) {
        ArrayList<String> pstring = new ArrayList<>();
        for (int i = 0; i < p.length(); i++) {
            if (p.charAt(i) == '.') {
                if (i + 1 < p.length()) {
                    if (p.charAt(i + 1) == '*') {
                        pstring.add(".*");
                    }
                }
            } else if (p.charAt(i) <= 'z' && p.charAt(i) >= 'a') {
                if (i + 1 < p.length()) {
                    if (p.charAt(i + 1) == '*') {
                        pstring.add(p.substring(i, i + 2));
                    }
                }
            }

        }
        int i = 0;
        int j = 0;
        for (; i < s.length() && j < pstring.size(); ) {
            String s1 = pstring.get(j);
            if (s1.length() == 1) {   //
                if (s.charAt(i) == s1.charAt(0)||s1
                .charAt(0)=='.') {
                    j++;
                    i++;
                } else {
                    return false;
                }

            } else {
                boolean b = s.charAt(i) == s1.charAt(0);
                if (b || s1.charAt(0) == '.') {
                    int k = i + 1;
                    for (; k < s.length(); k++) {
                        if (s.charAt(k) == s1.charAt(0) || s1.charAt(0) == '.') {
                            continue;
                        } else {
                            break;
                        }
                    }
                    i = k - 1;
                    j++;
                } else {
                    j++;
                    i++;
                }

            }

        }
        if (i == s.length() && j < pstring.size()) {
            return false;
        }
        if (i<s.length()&&j== pstring.size()){
            return false;
        }
        return true;
    }
}
